package logicaPresentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import logicaNegocio.Alumno;
import logicaNegocio.GestionAdministrador;
import logicaNegocio.GestionAlumnos;
import logicaNegocio.GestionProfesores;


public class VerAlumnos extends JInternalFrame implements ActionListener,Observer
{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private GestionAdministrador gAd;
	private GestionAlumnos gA;
	private GestionProfesores gP;
	private JTable tbAlumnos;
	private TablaAlumnos tAlumnos = null;		
	private JButton aceptar, mostrar, cancelar, borrar, buscar;
	private String eleccion,dni;
    private JScrollPane scrollPane; 
    private Box boxbotones;
    private JPanel jpBotones;
    private Map<String,Alumno> alumnos;
    private  Alumno alumnoseleccionado;
    private boolean verAlumno = false;
    private boolean verBuscador = false;
    private ClaseAObservar observable;
    
	public VerAlumnos(GestionAdministrador gAd,GestionAlumnos gA,GestionProfesores gP, String eleccion,String dni, ClaseAObservar observable)
	{
		
		super("Alumnos", 
	              true, 
	              false, 
	              true, 
	              true);
		setVisible(true);
		setSize(800,300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.alumnos = gA.getAlumnos();
		this.eleccion = eleccion;
		this.dni = dni;
		this.gAd = gAd;
		this.gA = gA;
		this.gP = gP;
		this.observable = observable;

		blnCargarFormulario();
	}
	
	public void blnCargarFormulario()
	{		
		crearTablaAlumnos();
		this.setLocation(200,200);
		this.setVisible(true);
		inicializarSubComponentes();
	}
	
	public void crearTablaAlumnos()
	{
		tbAlumnos=null;
		tAlumnos=new TablaAlumnos();
		
		if ((eleccion == "Administrador")||(eleccion == "Borrar"))
		{	 
			tAlumnos.crearTabla(gAd.getAlumnos());
		}
		if (eleccion == "Profesor")
		{
			tAlumnos.crearTabla(gP.getAlumnos());
		}
		tbAlumnos = new JTable(tAlumnos);
		tbAlumnos.setPreferredScrollableViewportSize(new Dimension(500, 70));
		tbAlumnos.setFillsViewportHeight(true);
		tbAlumnos.setEnabled(true);
		tbAlumnos.setRowSelectionAllowed(true);
		tAlumnos.fireTableDataChanged();
				
	}
	public void inicializarSubComponentes()
	{	
		try
		{
			
			scrollPane= new JScrollPane(tbAlumnos);

			this.getContentPane().setLayout(new BorderLayout());
	        this.getContentPane().add(scrollPane,"Center");
	        
	        if (eleccion.equals("Administrador"))
			{	
		        aceptar=new JButton("Aceptar");
				aceptar.addActionListener(this);
				mostrar=new JButton("Mostrar perfil del seleccionado");
				mostrar.addActionListener(this);
				buscar=new JButton("Buscar");
				buscar.addActionListener(this);
		      
		        boxbotones = Box.createHorizontalBox();
		        boxbotones.add(aceptar);
		        Box.createHorizontalStrut(20);
		        boxbotones.add(mostrar);
		        Box.createHorizontalStrut(20);
		        boxbotones.add(buscar);
			}
	        
	        if (eleccion.equals("Profesor"))
	        {
	        	aceptar=new JButton("Aceptar");
				aceptar.addActionListener(this);
						      
		        boxbotones = Box.createHorizontalBox();
		        boxbotones.add(aceptar);
	        }
	        
	        if(eleccion.equals("Borrar"))
	        {
	        	borrar=new JButton("Borrar");
	        	borrar.addActionListener(this);
				cancelar=new JButton("Cancelar");
				cancelar.addActionListener(this);
		      
		        boxbotones = Box.createHorizontalBox();
		        boxbotones.add(borrar);
		        Box.createHorizontalStrut(20);
		        boxbotones.add(cancelar);
	        }
	        
			jpBotones=new JPanel();
			jpBotones.setLayout(new FlowLayout());
			jpBotones.add(boxbotones);
			
			
			this.getContentPane().add(jpBotones,"South");
		}
		catch(Exception e){	}	
	}
		
	public void actionPerformed(ActionEvent e)
	{	
		if (e.getSource() instanceof JButton) 
		{
			JButton btnPulsado=(JButton)e.getSource();

			if ((btnPulsado==aceptar)||(btnPulsado==cancelar))
			{
				dispose();
			}
			if(btnPulsado==borrar)
			{
				int row = tbAlumnos.getSelectedRow();
				if(row>=0)
				{
					alumnos = gA.getAlumnos();
					
					alumnoseleccionado = alumnos.get(tbAlumnos.getValueAt(row, 0));//4 es el dni
					gAd.borrarAlumno(alumnoseleccionado);

					observable.setTabla();
					
					JOptionPane.showMessageDialog(null, "Tupla Borrada");
					dispose();
				}
				else
				{
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila si quiere borrar a un alumno");          
				}
			}	
			if(btnPulsado==mostrar)
			{
				int row = tbAlumnos.getSelectedRow();
				if(row>=0)
				{
					alumnos = gA.getAlumnos();
					alumnoseleccionado = alumnos.get(tbAlumnos.getValueAt(row, 0));//4 es el dni
					verAlumno = true;
					dispose();
				}
				else
				{
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila si quiere que se le muestre la informacion de un alumno");          
				}
			}
			if(btnPulsado==buscar)
			{
				verBuscador = true;
				dispose();
			}
		}
	}
	public Alumno getAlumnoseleccionado()
	{
		return alumnoseleccionado;
	}
	public boolean getVerAlumno()
	{
		return verAlumno;
	}
	public boolean getVerBuscador()
	{
		return verBuscador;
	}
	
	public void update(Observable arg0, Object arg1) 
	{
		tbAlumnos=null;	
		tAlumnos.crearTabla(gAd.getAlumnos());
		eleccion ="Administrador";
		tbAlumnos = new JTable(tAlumnos);
		tbAlumnos.setPreferredScrollableViewportSize(new Dimension(500, 70));
		tbAlumnos.setFillsViewportHeight(true);
		tbAlumnos.setEnabled(true);
		tbAlumnos.setRowSelectionAllowed(true);
		tAlumnos.fireTableDataChanged();
	}
	
	 class TablaAlumnos extends AbstractTableModel
	 {
 		/**
		 * 
		 */
		private static final long serialVersionUID = -3027916888011861262L;
		private String[] columnNames = {"Dni","Nombre"};
		private Object[][] data;
	    
		public void crearTabla(Map<String,Alumno> alumnos)
	    {
	    	int cont;
			if ((eleccion.equals("Administrador"))||(eleccion.equals("Borrar")))
			{	
				int filas = alumnos.size();
	    		data=new Object[filas][];
	    		cont=0;
	    		alumnos = gAd.ordenarAlumnos(alumnos);

	    		for (Map.Entry<String, Alumno> entry : alumnos.entrySet())
	    		{
	    			Alumno al = alumnos.get(entry.getKey());
	    			Object[]a={
	    					   new String(al.getDni()),
	    					   new String(al.getNombre()),	   
	    			};
				
	    			data[cont]=a;
				    cont++;
	    		
	    		}
			}
			
			if (eleccion.equals("Profesor"))
			{
				cont = gP.getNoAlumnos(dni);
	
	    		data=new Object[cont][];
				String [] noAlumnos =  gP.toStringAlumnos(dni, cont);
				String [] asignaturaAlumno =  gP.getAsignaturaAlumno();
				
				for (int i = 0 ; i<noAlumnos.length; i++)
	    		{
					String[] column = {"Nombre","Apellido", "Direccion","Telefono"," Dni"," Edad","Asignatura","Genero"};
					Alumno al = (Alumno) alumnos.get(noAlumnos[i]);
					
	    			Object[]a={
	    					   new String(al.getNombre()),
	    					   new String(al.getApellido()),
	    					   new String(al.getDireccion()),
	    					   new Integer(al.getTelefono()),
	    					   new String(al.getDni()),
	    					   new Integer(al.getEdad()),
	    					   new String(asignaturaAlumno[i]),
	    					   new String (al.getGenero())
	    			};
	    			
	    			data[i]=a;
	    			columnNames = column;
	    		} 
			}
	    	
	    }
	        
	    public int getColumnCount() 
	    {
	        return columnNames.length;
	    }
	
	    public int getRowCount() {
	        return data.length;
	    }
	
	    public String getColumnName(int col) 
	    {
	        return columnNames[col];
	    }
	
	    public Object getValueAt(int row, int col) 
	    {
	        return data[row][col];
	    }
	}
}
